enum SexEnum {
    SexGirl,
    SexBoy,
    SexOther,
}
// std::fmt::Display
// 当你想用 println!("{}", value) 或 format!("{}", value) 来打印一个值时，该类型需要实现 Display trait。
// std::fmt::Formatter要输出格式化的文件？
// std::fmt::Result返回。
// write!向文件写入内容。
impl std::fmt::Display for SexEnum {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match self {
            SexEnum::SexGirl => write!(f, "Girl"),
            SexEnum::SexBoy => write!(f, "Boy"),
            SexEnum::SexOther => write!(f, "Other"),
        }
    }
}

struct Student {
    name : String,
    addr : String,
    sex : SexEnum,
    age : u32,
}

impl Student {
    fn getage(&self) -> u32 {
        self.age
    }
    fn setage(&mut self, inage : u32) {
        self.age = inage;
    }
    fn get_sex(&self) -> &SexEnum {
        &self.sex
    }
    fn set_sex(&mut self, cfgsex : SexEnum) {
        self.sex = cfgsex;
    }
}

fn main() {
    {
        // 对于 Student 这类类型，默认是移动语义（所有权转移）
        let mut tmpsdt = Student {
            name : String::from("lxin"),
            addr : String::from("jinzhou"),
            sex : SexEnum::SexBoy,
            age : 33,
        };
        println!("student info:{:p},{},{},{},{}", &tmpsdt, tmpsdt.name, tmpsdt.addr, tmpsdt.sex, tmpsdt.age);
        println!("student age:{}", tmpsdt.getage());
        tmpsdt.setage(35);
        println!("student age:{}", tmpsdt.getage());
        println!("student sex:{}", tmpsdt.get_sex());
        tmpsdt.set_sex(SexEnum::SexGirl);
        println!("student sex:{}", tmpsdt.get_sex());
        tmpsdt.set_sex(SexEnum::SexOther);
        println!("student sex:{}", tmpsdt.get_sex());
    }
}
